Published on

基于 XtraBackup 的 MySQL 数据库快速同步与单库恢复实践

Authors
  • avatar
    Name
    Liant
    Twitter

快速同步恢复数据库

基于 xtrabackup、nc 需要提前安装

yum install -y nc

数据库A 10.8.30.64

数据库S 10.8.30.65 (原数据库A的主库)

数据库B 10.8.30.68

  • 故障情况: 数据库A 磁盘文件受损,无法正常启动。
  • 调整 innodb_fast_shutdown=1,innodb_force_recovery=5 才能启动
  • 保全原有数据,进行迁移到数据库B
  • 调整 bind-address=127.0.0.1 禁止数据插入,保持完整
实现数据库 S与数据库 B数据一致搭建主从

从数据库S全备

exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
"xtrabackup --backup --slave-info --stream=xbstream --socket=/apps/program/tmp/mysql.sock  --user=root --password=123456"

数据库B同步全数据文件

ncat --recv-only 10.8.30.64 3307 | xbstream -x -C /apps/mysql/data

数据库B进行数据还原

/apps/sh/tool/bin/xtrabackup --prepare --target-dir=/apps/mysql/data

赋予权限

chown -R mysql:mysql /apps/mysql/data/*

移走undo文件

cp -a undo00* ../undo_space/

启动数据库B,查看是否正常

service mysqld start

创建tmp目录

mkdir -p /apps/mysql/logs/mysqld/tmp/

chown -R mysql:mysql /apps/mysql/logs/mysqld/tmp/

搭建主从关系

启动主从,查看是否正常

  • 恢复 数据库A data_center_bak 库的数据到 数据库B
#########       恢复单库的数据       #########
# 10.8.30.64 xtrabackup压缩备份
innobackupex --defaults-file=/etc/my.cnf  --socket=/apps/program/tmp/mysql.sock --databases data_center_bak --user=yunweiad --password=qlWyXs7CDb --slave-info --lock-wait-timeout=120 --compress --no-timestamp /mnt/back_data_center_bak


# xtrabackup还原
<<<<<<<<<<<<<<< 源端 10.8.30.64 >>>>>>>>>>>>>>>
## 生成 import、dicard语句
mysql -p -e "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='ceshi';">/tmp/import_tbs.sql
mysql -p -e "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='ceshi';" >/tmp/discard_tbs.sql

## 导出数据库的表结构
mysqldump -uroot -p -d -f --master-data=2 --single-transaction --databases ceshi > /tmp/backup_db1.sql

## 传输备份文件
scp -r /mnt/back_data_center_bak 10.8.30.68:/mnt
scp -r /tmp/backup_db1.sql 10.8.30.68:/tmp/


<<<<<<<<<<<<<<< 目标端 10.8.30.68 >>>>>>>>>>>>>>

## 解压备份
xtrabackup --decompress --target-dir=/mnt/back_data_center_bak

## 对备份数据进行apply-log日志应用及将数据进行export转换生成配置文件
innobackupex --apply-log /mnt/back_data_center_bak

## 恢复表结构
create database ceshi
use ceshi

## 删除对应表空间文件
use ceshi; source discard_tbs.sql

## 拷贝数据文件、配置文件到对应目录
cp /mnt/back_data_center_bak/*.ibd /apps/mysql/data/data_center_bak

cp /mnt/back_data_center_bak/*.cfg /apps/mysql/data/data_center_bak

## 改权限
chown -R mysql:mysql /apps/mysql/data/data_center_bak/*

## 导入表空间文件
source /tmp/import_tbs.sql

## 可以观察是否有报错
less /data/mysql/data/mysql-error.log